// 定义Promise构造函数
function Promise(excutor){
    this.PromiseState = "pending";
    this.PromiseResult = undefined;
    this.callbacks = []; // 用于存放待执行函数的属性

    // 声明成功处理内函数
    const success = (value) => {
        // 判断状态PromiseState是否已经不是pending，则退出
        if(this.PromiseState != "pending") return;
        this.PromiseState = "fulfilled";
        this.PromiseResult = value;
        // 执行callbacks属性里面保存下来没有执行的回调（异步导致）
        this.callbacks.forEach(item => {
            // 执行成功的回调方法ok
            item.ok(this.PromiseResult);
        });
    }
    const error = (reason) => {
        // 判断状态PromiseState是否已经不是pending，则退出
        if(this.PromiseState != "pending") return;
        this.PromiseState = "rejected";
        this.PromiseResult = reason;
        // 执行callbacks属性里面保存下来没有执行的回调（异步导致）
        this.callbacks.forEach(item => {
            // 执行失败的回调方法ng
            item.ng(this.PromiseResult);
        });
    } 
    try {
        // 执行excutor函数，要求传递两个函数类型参数
        excutor(success, error);
    } catch (e) {
        error(e);
    }
    
}

// 在Promise构造函数的原型上添加then方法
Promise.prototype.then = function(onResolved, onRejected){
    return new Promise((resolve, reject) => {
        
        // 判断PromiseState状态值来执行对应的参数函数
        if(this.PromiseState === "fulfilled"){
            try{
                let res = onResolved(this.PromiseResult);
                // 判断res结果是否是一个Promise
                if(res instanceof Promise){
                    // 将当前res的promise状态添加到新的Promise
                    res.then(v => {
                        resolve(v);
                    },r => {
                        reject(r);
                    });
                } else {
                    // 若返回值不是Promise对象，就直接返回一个成功的，值为返回值的promise
                    resolve(res);
                }
            }catch(e){
                reject(e);
            }
        }
        if(this.PromiseState === "rejected"){
            try{
                let res = onRejected(this.PromiseResult);
                // 判断res结果是否是一个Promise
                if(res instanceof Promise){
                    // 将当前res的promise状态添加到新的Promise
                    res.then(v => {
                        resolve(v);
                    },r => {
                        reject(r);
                    });
                } else {
                    // 若返回值不是Promise对象，就直接返回一个成功的，值为返回值的promise
                    resolve(res);
                }
            }catch(e){
                reject(e);
            }
        }
            // 判断PromiseState状态值为pending时，先将两个参数函数收取起来，等待改变状态是再次执行
            if(this.PromiseState === "pending"){
                // 将当前待调用的回调函数保存起来
                this.callbacks.push({
                    // 状态成功时调用方法
                    ok:function(value){
                        onResolved(value);
                    },
                    // 状态失败是调用方法
                    ng:function(reason){
                        onRejected(reason);
                    }
                })
            }
        
    });
    
}   